package client;


import model.Questions;
import model.Results;
import model.User;
import model.UserMessage;

import java.io.*;
import java.security.cert.TrustAnchor;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
 * 编程实现客户端的主界面绘制和相应功能的实现
 */
public class ClientView {
    /**
     * 为了可以使用输入输出流，采用合成复用原则实现
     */
    private ClientInitClose cic;

    /**
     * 通过构造方法实现成员变量的初始化
     *
     * @param cic
     */
    public ClientView(ClientInitClose cic) {
        this.cic = cic;
    }

    /**
     * 自定义成员方法实现客户端主界面的绘制
     */
    public void clientMainPage() throws IOException, ClassNotFoundException {
        boolean flag = true;
        while (flag) {
            System.out.println("  \n\n\t\t   在线考试系统");
            System.out.println("-------------------------------------------");
            System.out.print("   [1] 学员系统");
            System.out.println("     [2] 管理员系统");
            System.out.println("   [0] 退出系统");
            System.out.println("-------------------------------------------");
            System.out.println("请选择要进行的业务编号：");
            //Scanner sc = new Scanner(System.in);
            //int choose = sc.nextInt();
            int choose = ClientScanner.getScanner().nextInt();
            switch (choose) {
                case 1:
                    System.out.println("正在进入学员系统...");
                    clientStudentLogin();
                    break;
                case 2:
                    System.out.println("正在进入管理员系统...");
                    clientManagerLogin();
                    break;
                case 0:
                    System.out.println("正在退出系统...");
                    flag = false;
                    break;
                default:
                    System.out.println("输入错误，请重新选择！");
            }
        }
        clientExit();
    }

    /**
     * 客户端退出
     */
    private void clientExit() throws IOException {
        cic.getOos().writeUTF("客户端退出");//先发送请求内容
        String exit = "退出";
        cic.getOos().writeObject(exit);
    }

    /**
     * 自定义成员方法实现客户端管理员登录的功能
     */
    private void clientManagerLogin() throws IOException, ClassNotFoundException {
        // 1.准备管理员登录的相关数据
        System.out.println("请输入管理员的账户信息：");
        String userName = ClientScanner.getScanner().next();
        System.out.println("请输入管理员的密码信息：");
        String password = ClientScanner.getScanner().next();
        UserMessage tum = new UserMessage("managerCheck", new User(userName, password));
        // 2.将UserMessage类型的对象通过对象输出流发送给服务器
        cic.getOos().writeUTF("登录管理员系统");//先发送请求内容
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送管理员账户信息成功！");
        // 3.接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        if ("success".equals(tum.getType())) {
            System.out.println("登录成功，欢迎使用！");
            ClientManagerView cmv = new ClientManagerView(cic,tum);
            cmv.ManagerMainView();//进入管理员系统主界面
        } else {
            System.out.println("用户名或密码错误！");
        }
    }

    /**
     * 自定义成员方法实现客户端学员登录的功能
     */
    private void clientStudentLogin() throws IOException, ClassNotFoundException {
        // 1.准备管理员登录的相关数据
        System.out.println("请输入学员的账户信息：");
        String userName = ClientScanner.getScanner().next();
        System.out.println("请输入学员的密码信息：");
        String password = ClientScanner.getScanner().next();
        UserMessage tum = new UserMessage("managerCheck", new User(userName, password));
        // 2.将UserMessage类型的对象通过对象输出流发送给服务器
        cic.getOos().writeUTF("登录学员系统");//先发送请求内容
        cic.getOos().writeObject(tum);//发送对象信息
        System.out.println("客户端发送学员账户信息成功！");
        // 3.接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        if ("success".equals(tum.getType())) {
            System.out.println("登录成功，欢迎使用！");
            studentView(tum);
        } else {
            System.out.println("用户名或密码错误！");
        }
    }

    /**
     * 实现客户端学员系统功能界面的绘制
     */
    private void studentView(UserMessage tum) throws IOException, ClassNotFoundException {
        UserMessage ums = tum;
        while (true) {
            System.out.println("  \n\n\t\t   学员系统");
            System.out.println("-------------------------------------------");
            System.out.println("用户模块：\t[1] 修改密码\t[2] 退出");
            System.out.println("考试模块：\t[3] 开始考试\t[4] 查询成绩\t[5] 导出成绩");
            System.out.println("-------------------------------------------");
            System.out.println("请选择要进行的业务编号：");
            int choose = ClientScanner.getScanner().nextInt();
            switch (choose) {
                case 1:
                    System.out.println("正在进入修改密码功能...");
                    udatePassword(ums);//调用修改密码成员方法
                    break;
                case 2:
                    System.out.println("正在退出学员系统...");
                    return;
                case 3:
                    System.out.println("正在进入开始考试...");
                    startExam(ums);//开始考试
                    break;
                case 4:
                    System.out.println("正在进入查询成绩...");
                    seeGrade();
                    break;
                case 5:
                    System.out.println("正在导出成绩...");
                    exportGrade();//导出成绩
                    break;
                default:
                    System.out.println("输入错误，请重新选择！");
            }
        }

    }

    /**
     * 自定义成员方法实现修改密码功能
     *
     * @param ums
     */
    private void udatePassword(UserMessage ums) throws IOException, ClassNotFoundException {
        String password = ums.getUser().getPassword();//原密码
        System.out.println("请输入原密码");
        String input = ClientScanner.getScanner().next();
        //判断是否本人修改，防止登录后被他人恶意修改密码
        if (input.equals(password)) {
            User user = ums.getUser();
            System.out.println("原密码正确，请输入新密码");
            String newPassword = ClientScanner.getScanner().next();
            user.setPassword(newPassword);//修改用户密码
            ums.setUser(user);
            cic.getOos().writeUTF("修改密码");//先发送请求内容
            cic.getOos().writeObject(ums);
            System.out.println("客户端发送修改密码成功！");
            // 3.接收服务器的处理结果并给出提示
            UserMessage tum = (UserMessage) cic.getOis().readObject();
            if ("success".equals(tum.getType())) {
                System.out.println("修改密码成功！");

            } else {
                System.out.println("修改密码失败！");
                user.setPassword(password);//将用户名密码重置会初始状态
                ums.setUser(user);
            }
        } else {
            System.out.println("原密码输入错误");
        }
    }

    /**
     * 自定义成员方法实现客户端考试功能
     *
     * @param ums
     */
    Results results;

    private void startExam(UserMessage ums) throws IOException, ClassNotFoundException {
        cic.getOos().writeUTF("开始考试");//先发送请求内容
        cic.getOos().writeObject(ums);//发送用户信息给系统
        //接收服务器的处理结果并给出提示
        Map<String, String> map = (Map<String, String>) cic.getOis().readObject();//接收服务器返回来的考题
        int grade = 0;//记录成绩
        results = new Results();//记录考试情况
        //遍历每一道考题
        Set<String> keys = map.keySet();
        for (var key : keys) {
            String[] strings = new String[4];
            System.out.println( key);
            System.out.println("请输入你的答案");
            String answer = ClientScanner.getScanner().next();
            strings[0] = key;//记录试题
            strings[1] = map.get(key);//记录正确答题
            strings[2] = answer;//记录学员答案
            //如果输入的答案与题目的答案相同,不区分字母大小写
            if (answer.equalsIgnoreCase(map.get(key))) {
                grade++;//如果改题目答对了，+1分
                strings[3] = "答对";
            } else {
                strings[3] = "答错";
            }
            results.getList().add(strings);//将作答情况记录
        }
        //答题完毕，记录分数
        results.setGrade(grade);
        System.out.println("本次考试完毕，请自行查看成绩");
    }

    /**
     * 自定义成员方法查看上次考试成绩
     */
    private void seeGrade() {
        if (results != null) {
            System.out.println("本次考试共答对" + results.getGrade() + "道题目");
            System.out.println("答卷如下");
            List<String[]> list = results.getList();
            for (var t : list) {
                System.out.println(t[0] + " 正确答案 " + t[1] + " 你的答案 " + t[2] + "   " + t[3]);
            }
        } else {
            System.out.println("本次登录还未开始考试");
        }
    }

    /**
     * 导出成绩
     */
    private void exportGrade() throws IOException {
        if (results != null) {
            long lg = System.currentTimeMillis();//获取当前系统时间
            String fileName = "D:/" + lg + ".txt";//导出成绩到D盘中
            BufferedWriter bw = new BufferedWriter(new FileWriter(new File(fileName)));//创建输出流对象
            bw.write("答卷如下\n");
            List<String[]> list = results.getList();
            for (var t : list) {
                bw.write(t[0] + "\n正确答案 " + t[1] + " 你的答案 " + t[2] + "   " + t[3] + "\n");
            }
            bw.flush();
            bw.close();
            System.out.println(fileName);
            System.out.println("成绩导出成功");
        } else {
            System.out.println("本次登录还未开始考试");
        }
    }
}
